/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.selo.DetalheEntradaSelo;
import br.com.deployment.entidade.selo.EntradaSelo;
import br.com.deployment.entidade.selo.TipoSelo;
import br.com.deployment.entidade.selo.Selo;
import br.com.deployment.entidade.empresa.Fornecedor;
import br.com.deployment.entidade.acesso.Usuario;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.DetalheEntradaSeloServico;
import br.com.deployment.servico.EntradaSeloServico;
import br.com.deployment.servico.FornecedorServico;
import br.com.deployment.servico.SeloServico;
import br.com.deployment.servico.TipoSeloServico;
import br.com.deployment.servico.UsuarioServico;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author elyjr
 */
@ManagedBean
@ViewScoped
public class ManagerEntrada implements Serializable {

    @EJB
    EntradaSeloServico entradaDao;
    @EJB
    FornecedorServico fornecedorDao;
    @EJB
    TipoSeloServico tipoSeloDao;
    @EJB
    DetalheEntradaSeloServico detalheEntradaSeloDao;
    @EJB
    SeloServico seloDao;
    @EJB
    UsuarioServico usuarioDao;
    
    @EJB
    private EntradaSeloServico entradaSeloServico;
    
    private EntradaSelo entradaSelo;
    private DetalheEntradaSelo detalhe;
    private List<DetalheEntradaSelo> listDetalhe;
    private List<EntradaSelo> listEntradaSelo;
    private Selo selo;
    private Usuario usr;
    private Integer qtd;
    private Integer numFim;

    public ManagerEntrada() {
        System.out.println("Reiniciou");
    }

    @PostConstruct
    public void init() {
        System.out.println("Reiniciou");
        this.entradaSelo = new EntradaSelo();
        this.detalhe = new DetalheEntradaSelo();
        this.listDetalhe = new ArrayList<DetalheEntradaSelo>();
        this.listEntradaSelo = new ArrayList<EntradaSelo>();
        this.selo = new Selo();
        this.usr = new Usuario();
        this.numFim = 0;
        this.qtd = 0;
    }

    public void reinit() {
        entradaSelo = new EntradaSelo();
        detalhe = new DetalheEntradaSelo();
        listEntradaSelo = new ArrayList<EntradaSelo>();
        listDetalhe = new ArrayList<DetalheEntradaSelo>();
    }

    public int sumQtd() {
        if (detalhe.getNumFim() > detalhe.getNumIni() + detalhe.getQtd()) {
            return detalhe.getNumFim() - detalhe.getNumIni();
        }
        return detalhe.getQtd();
    }



    public Integer getQtd() {
        return qtd;
    }

    public void setQtd(Integer qtd) {
        this.qtd = qtd;
    }

    public void reinitListDetalheEntrada() {
        listDetalhe = new ArrayList<DetalheEntradaSelo>();
    }

    public void removeList(DetalheEntradaSelo de) {
        System.out.println("Removeu:" + de);
        listDetalhe.remove(de);
    }

    public void editList() {
        FacesContext context = FacesContext.getCurrentInstance();
        Map map = context.getExternalContext().getRequestParameterMap();
        String x = (String) map.get("param");
        int ds = Integer.parseInt(x);
        detalhe = listDetalhe.get(ds);
        numFim = detalhe.getNumFim();
        qtd = detalhe.getQtd();
        listDetalhe.remove(ds);
        System.err.println(map);


    }

    public void reinitDetalhe() {
        detalhe = new DetalheEntradaSelo();
        detalhe.setPreco(new Double(0L));
    }

//   public void adicionarDetalhe(){
//        detalhe.setQtd(qtd);
//        if(qtd > numFim){
//            detalhe.setNumFim((qtd + numFim)-1);
//        }else{
//            detalhe.setNumFim(numFim);
//        }
//        
//        detalhe.setTipoSelo(tipoSeloDao.find(detalhe.getTipoSelo().getId()));
//        
//        listDetalhe.add(detalhe);
//        detalhe = new DetalheEntradaSelo();
//        qtd = 0;
//        numFim = 0;
//    }
    public void adicionarDetalhe() {
        boolean contains = false;
        
        if(qtd != null && qtd != 0 ){
            detalhe.setQtd(qtd);
            detalhe.setNumFim(numFim > qtd ? numFim : qtd + detalhe.getNumIni() - 1);
        }else if(numFim != null && numFim != 0 && numFim > qtd){
            detalhe.setQtd(numFim - detalhe.getNumIni() + 1);
            detalhe.setNumFim(numFim);
        }
        
        
//        if(detalhe.getQtd()==0){
//            detalhe.setQtd(detalhe.getNumFim() - detalhe.getNumIni() + 1);
//        }else if(detalhe.getNumFim()==0){
//            detalhe.setNumFim(detalhe.getNumIni() + detalhe.getQtd() - 1);
//        }
        
        detalhe.setTipoSelo(tipoSeloDao.find(detalhe.getTipoSelo().getId()));

        for (DetalheEntradaSelo dsVer : listDetalhe) {
            if ((dsVer.getSerie().equalsIgnoreCase(detalhe.getSerie())) && (dsVer.getTipoSelo().getId() == detalhe.getTipoSelo().getId())) {
                if ((detalhe.getNumIni() >= dsVer.getNumIni()) && (detalhe.getNumFim() <= dsVer.getNumFim())) {
                    contains = true;
                }
            }
        }
        if (!contains) {
            listDetalhe.add(detalhe);
            detalhe = new DetalheEntradaSelo();
            qtd = 0;
            numFim = 0;
        } else {
            Msg.messagemWarn("Série, Tipo do Selo, valor e numeração duplicada, verifique os dados!");
        }
    }

    public List<EntradaSelo> listarEntradaSelo() {
        try {
            listEntradaSelo = entradaDao.findAll();
        } catch (EJBAccessException erro) {
            erro.getMessage();
        }
        return listEntradaSelo;
    }

   
    public void salvar(){
        entradaSelo.setListDetalhe(listDetalhe);
        entradaSeloServico.salvar(entradaSelo);
        reinit();
        Msg.messagemInfo("Entrada Salva com Sucesso");
    }

    public void editar() {
        try {
            entradaSelo.setDataAlteracao(new Date());
            entradaSelo.setListDetalhe(listDetalhe);
            entradaDao.atualizar(entradaSelo);

            Msg.messagemInfo("Entrada Alterada com Sucesso");

        } catch (EJBAccessException erro) {
            erro.getMessage();
        }
    }

    public void editarEntrada(EntradaSelo ent) {
        FacesContext context = FacesContext.getCurrentInstance();
        if (ent != null) {
            try {

                entradaSelo = ent;
                listDetalhe = entradaSelo.getListDetalhe();

                context.getExternalContext().redirect("/Cartorio-war/editarEntradaSelo.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(ManagerEntrada.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void criarEntradaSelo() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            reinit();
            context.getExternalContext().redirect("/Cartorio-war/criarEntradaSelo.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(br.com.deployment.manager.ManagerEntrada.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

//    public void pesquisarEntradaSelo() {
//        FacesContext context = FacesContext.getCurrentInstance();
//        try {
//            reinit();
//            entradaSelo = new EntradaSelo();
//            
//            
//            context.getExternalContext().redirect("/Cartorio-war/buscarEntradaSelo.xhtml");
//        } catch (IOException ex) {
//            Logger.getLogger(br.com.deployment.manager.ManagerEntrada.class.getName()).log(Level.SEVERE, null, ex);
//        }
//
//    }
    public void indexEntradaSelo() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            reinit();
            context.getExternalContext().redirect("/Cartorio-war/indexEntradaSelo.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(br.com.deployment.manager.ManagerEntrada.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void handleSelect(SelectEvent event) {
        Fornecedor forn = (Fornecedor) event.getObject();
        entradaSelo.setFornecedor(fornecedorDao.find(forn.getId()));
    }

    public void handleSelectTipoSelo(SelectEvent event) {
        TipoSelo ts = (TipoSelo) event.getObject();
        detalhe.setTipoSelo(tipoSeloDao.find(ts.getId()));
    }

    public DetalheEntradaSelo getDetalhe() {
        return detalhe;
    }

    public void setDetalhe(DetalheEntradaSelo detalhe) {
        this.detalhe = detalhe;
    }

    public EntradaSelo getEntradaSelo() {
        return entradaSelo;
    }

    public void setEntradaSelo(EntradaSelo entradaSelo) {
        this.entradaSelo = entradaSelo;
    }

    public List<DetalheEntradaSelo> getListDetalhe() {
        return listDetalhe;
    }

    public void setListDetalhe(List<DetalheEntradaSelo> listDetalhe) {
        this.listDetalhe = listDetalhe;
    }

    public List<EntradaSelo> getListEntradaSelo() {
        return listEntradaSelo;
    }

    public void setListEntradaSelo(List<EntradaSelo> listEntradaSelo) {
        this.listEntradaSelo = listEntradaSelo;
    }

    public Selo getSelo() {
        return selo;
    }

    public void setSelo(Selo selo) {
        this.selo = selo;
    }

    public Usuario getUsr() {
        return usr;
    }

    public void setUsr(Usuario usr) {
        this.usr = usr;
    }

    public Integer getNumFim() {
        return numFim;
    }

    public void setNumFim(Integer numFim) {
        this.numFim = numFim;
    }
    
    
    
}
